package com.itheima.service.impl;


import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.PhoneUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.SecureUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.heima.model.common.dtos.ResponseResult;
import com.heima.model.common.enums.AppHttpCodeEnum;
import com.heima.model.user.dto.UserLoginDto;
import com.heima.model.user.pojo.ApUser;
import com.heima.utils.common.HutoolJWT;
import com.itheima.mapper.UserMapper;
import com.itheima.service.UserService;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.UUID;

/**
 * @author yunfei
 * @date 2022年10月14日 9:46
 * <p>
 * APP客户端User业务实现类
 */
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, ApUser> implements UserService {
    /**
     * App端用户登录的业务实现
     *
     * @param loginDto
     * @return
     */
    @Override
    public ResponseResult loginAuth(UserLoginDto loginDto) {
        /*
        2.  校验数据的合法性  手机号码 密码
        3.  根据手机号码去数据库中查询一个User对象回来
        4.  判断这个User是否存在
            4.1  如果存在就比对密码是否正确
                4.1.1  如果密码错误 返回错误提示
                4.1.2 如果密码正确  判断该账号是否被禁用
                4.1.2.1  如果被禁用  返回错误提示
                4.1.2.2 如果没有被禁用  返回Token
            4.2  如果User对象不存在  实现自动注册
                 4.2.1   把当前用户输入的手机号码 和密码 保存到数据库中
                 4.2.2  创建Token 返回登录成功
        5.  如果手机号码和密码为空 则认定为游客模式
        6.  给当前的游客返回一个用户信息为空的Token
        */

        // 校验数据的合法性  手机号码
        if (StrUtil.isNotBlank(loginDto.getPhone()) && !PhoneUtil.isMobile(loginDto.getPhone())) {
            // 返回手机号码不合法
            return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID, "手机号码格式错误");
        }

        // 判断手机号码和密码是否合法
        if (StrUtil.isNotBlank(loginDto.getPhone())) {
            ApUser user = getOne(Wrappers.lambdaQuery(ApUser.class).eq(ApUser::getPhone, loginDto.getPhone()));
            if (ObjectUtil.isNotNull(user)) {
                // 正常的登录逻辑
                // 拿到用户输入的密码 和 盐做MD5
                String pass = SecureUtil.md5(loginDto.getPassword() + user.getSalt());
                // 和数据库中的密码做对比
                if (!StrUtil.equals(pass, user.getPassword())) {
                    return ResponseResult.errorResult(AppHttpCodeEnum.LOGIN_PASSWORD_ERROR);
                }
                // 判断账号是否被禁用
                if (user.getStatus()) return ResponseResult.errorResult(AppHttpCodeEnum.LOGIN_STATUS_ERROR);
            } else {
                // 自动注册
                // 把用户的信息保存到数据库中
                user = new ApUser();
                user.setPhone(loginDto.getPhone());
                // 生成一个随机串 作为用户的盐
                String salt = UUID.randomUUID().toString().replace("-", "");
                user.setPassword(SecureUtil.md5(loginDto.getPassword() + salt));
                user.setSalt(salt);
                // 默认新创建的账号都是启用状态
                // 0 启用状态  1  禁用状态
                user.setStatus(false);
                /* 保存数据到数据库中  相当于实现了用户的注册功能 */
                save(user);
            }
            // 生成Token 并 返回
            HashMap<String, Object> mm = new HashMap<>();
            mm.put("id", user.getId());
            String token = HutoolJWT.creatToken(mm);
            HashMap<Object, Object> result = new HashMap<>();
            result.put("token",token);
            return ResponseResult.okResult(result);
        }

        // 游客登录
        // 生成Token 并 返回
        HashMap<String, Object> mm = new HashMap<>();
        mm.put("id", "");
        String token = HutoolJWT.creatToken(mm);

        HashMap<Object, Object> result = new HashMap<>();
        result.put("token",token);
        return ResponseResult.okResult(result);
    }
}
